#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H

#include <QObject>
#include <QWebSocket>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QUuid>

class WebSocketClient : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketClient(QObject *parent = nullptr);
    ~WebSocketClient();

    // 连接到WebSocket服务器
    void connectToServer(const QString &url);
    // 断开连接
    void disconnectFromServer();
    // 请求RTSP URL
    void requestRtspUrl(const QString &cameraId);
    // 发送自定义消息
    void sendMessage(const QString &message);
    // 是否已连接
    bool isConnected() const;
    
    // 获取挑战码
    void requestChallenge(const QString &username, const QString &deviceId);
    // 提交登录凭证
    void login(const QString &username, const QString &challenge, 
               const QString &credential, const QString &deviceId,
               bool rememberMe = false);
    // 刷新令牌
    void refreshToken(const QString &refreshToken, const QString &deviceId);
    // 登出
    void logout(const QString &deviceId, bool logoutAll = false);

signals:
    // 连接状态变化信号
    void connectionStateChanged(bool connected);
    // 收到RTSP URL信号
    void rtspUrlReceived(const QString &url, const QString &expiresAt);
    // 收到文本消息信号
    void textMessageReceived(const QString &message);
    // 错误信号
    void errorOccurred(const QString &errorMessage);
    // 登录相关信号
    void challengeReceived(const QString &challenge, int expiresIn);
    void loginSuccess(const QString &accessToken, const QString &refreshToken, 
                     const QJsonObject &userInfo);
    void loginFailed(int errorCode, const QString &errorMessage);

private slots:
    // 连接成功
    void onConnected();
    // 连接断开
    void onDisconnected();
    // 收到消息
    void onTextMessageReceived(const QString &message);
    // 发生错误
    void onError(QAbstractSocket::SocketError error);

private:
    QWebSocket m_webSocket;
    bool m_connected;
    QMap<QString, QString> m_pendingRequests; // 请求ID到相关信息的映射
};

#endif // WEBSOCKETCLIENT_H